package fr.blogger.ejb.outils;

import java.util.Date;

import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

import fr.blogger.ejb.facade.UtilisateurFacade;
import fr.blogger.ejb.model.Utilisateur;

/** Classe utilitaire pour l'authentication
 * 
 * @author l.parrot1 */
public abstract class UtilsAuthentication {

	/** Constructeur de la classe <code>UtilsAuthentication</code>. */
	private UtilsAuthentication() {
	}

	/** Chiffre le mot de passe d'un utilisateur.
	 * 
	 * @param password {@link String} le mot de passe à chiffrer.
	 * @param date {@link Date} la date a utiliser
	 * @return {@link String} Le mot de passe chiffré. */
	public static String chiffrerMotdepasse(String password, Date date) {
		return new ShaPasswordEncoder(512).encodePassword(password, date);
	}

	/** Recupere le username de l'utilisateur loggué
	 * 
	 * @return {@link String}. */
	public static String getLogin() {
		String login = null;
		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
		if (authentication != null) {
			login = authentication.getName();
		}
		return login;
	}

	/** Retourne l'utilisateur qui se trouve en session
	 * 
	 * @return {@link Object} */
	public static Utilisateur getUserSession() {
		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
		if (authentication != null && (authentication.getDetails() instanceof Utilisateur)) {
			return (Utilisateur) UtilsAuthentication.getAuthentication().getDetails();
		}
		if (authentication != null && (authentication.getPrincipal() instanceof Utilisateur)) {
			return (Utilisateur) UtilsAuthentication.getAuthentication().getPrincipal();
		}
		return null;
	}

	/** Retourne l'authentication du contexte de sécurité
	 * 
	 * @return {@link Authentication} */
	public static Authentication getAuthentication() {
		return SecurityContextHolder.getContext().getAuthentication();
	}

	/** Retourne le contexte de sécurité
	 * 
	 * @return {@link SecurityContext} */
	public static SecurityContext getSecurityContext() {
		return SecurityContextHolder.getContext();
	}

	/** Modifie le userdetails en session dans le security context */
	public static void updateUserDetailsSession() {
		((AbstractAuthenticationToken) UtilsAuthentication.getAuthentication()).setDetails(UtilsEJB.getService(UtilisateurFacade.class).find(getUserSession().getId()));
	}

	/** Modifie le userdetails dans le security context
	 * 
	 * @param idUtilisateur {@link Integer} */
	public static void updateUserDetails(Integer idUtilisateur) {
		((AbstractAuthenticationToken) UtilsAuthentication.getAuthentication()).setDetails(UtilsEJB.getService(UtilisateurFacade.class).find(idUtilisateur));
	}

	/** retourne vrai si l'utilisateur est au moins dans un des roles passés en
	 * paramètre
	 * 
	 * @param roles {@link String}...
	 * @return boolean */
	public static boolean isUserInRoles(String... roles) {
		for (String role : roles) {
			if (getUserSession().getAuthorities().contains(new SimpleGrantedAuthority(role))) {
				return true;
			}
		}
		return false;
	}

}
